package com.woniu.controller.app;

import com.woniu.entity.Result;
import com.woniu.entity.dto.RegisterDTO;
import com.woniu.service.IUserService;
import com.woniu.utils.SMSUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.*;

import java.util.Map;
import java.util.concurrent.TimeUnit;

@RestController
@RequestMapping("/app/user/")
public class AppUserController {

    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private IUserService userService;

    /**
     * mobile: 手机号码
     * location：场景
     * @param map
     * @return
     */
    @PostMapping("/getPhoneCode")
    public Result getPhoneCode(@RequestBody Map<String, String> map){
        // 1. 对数据进行规则判断
        if(map.size() == 0 || !StringUtils.hasLength(map.get("mobile"))){
            return Result.error("发送验证码失败");
        }
        // 2. 生成验证码，调用短信工具类发送短信
        String code = SMSUtils.getRandomNum(4);
        // 判断这场景今天还能不能发送短信 TODO
        SMSUtils.sendSms(map.get("mobile"), code);
        // 3. 保存验证码，验证码保存redis中，string key(手机号-场景)-value(code)
        redisTemplate.opsForValue().set(map.get("mobile") + "-" + map.get("location"), code, 3, TimeUnit.MINUTES);
        return Result.ok();
    }

    @PostMapping("/register")
    public Result register(@RequestBody RegisterDTO registerDTO) throws Exception {
        // 1. 对数据进行规则校验
        if(!StringUtils.hasLength(registerDTO.getMobile())){
            return Result.error("请填写正确的数据");
        }
        // 2. 校验验证码，如果不成功，给提示并返回
        Object redisCode = redisTemplate.opsForValue().get(registerDTO.getMobile() + "-" + registerDTO.getLocation());
        if(redisCode == null){
            return Result.error("验证码已经过期，请重新获取验证码");
        }
        if(!redisCode.toString().equals(registerDTO.getCode())){
            return Result.error("验证码错误");
        }
        // 3. 如果校验成功，将redis中的验证码删除（一次性的数据）
        redisTemplate.delete(registerDTO.getMobile() + "-" + registerDTO.getLocation());
        // 4. 调用service完成注册功能
        Boolean flag = userService.register(registerDTO);
        // 5. 根据service返回的结果响应数据
        return Result.commonByFlag(flag);
    }

}